Objetivo_3#

import pandas as pd
import numpy as np
import plotly.express as px
import altair as alt
import datos
import plotly.graph_objects as go
import warnings

warnings.simplefilter(action='ignore', category=FutureWarning
                )

Hipolipemiantes segun agrupaciones#

agrupaciones = ['sexo','tipo_de_afiliacion','edad_grupo','lugar_de_nacimiento','lugar_de_procedencia'] + ['hipertension','infarto de miocardio','arritmia','insuficiencia cardiaca congestiva','nefropatia']+['fumador','bebedor']
variable = 'Hipolipemiante'
edad_intervals = [0, 49, 59, 79, 150]
edad_labels = ['<50', '50-59', '60-79', '>80']
datos.datos['edad_grupo'] = pd.cut(datos.datos['edad_calculada'], bins=edad_intervals, labels=edad_labels, right=False)

for agrupacion in agrupaciones:
    tabla_frecuencias = pd.crosstab(datos.datos[agrupacion], datos.datos[variable])
    totales_columna = tabla_frecuencias.sum(axis=0)  
    totales_columna_df = pd.DataFrame(totales_columna).T  
    totales_columna_df.index = ['Total'] 
    totales_fila = tabla_frecuencias.sum(axis=1) 
    tabla_frecuencias['Total'] = totales_fila  
    tabla_con_totales = pd.concat([tabla_frecuencias, totales_columna_df], axis=0)
    fig = go.Figure(data=[go.Table(
        header=dict(values=['Categoría'] + list(tabla_con_totales.columns),
                      fill_color='paleturquoise',
                      align='center'),
        cells=dict(values=[tabla_con_totales.index] + [tabla_con_totales[col] for col in tabla_con_totales.columns],
                   fill_color='lavender',
                   align='center'))
    ])

    fig.update_layout(title=f'Tabla de Frecuencias: {agrupacion} vs {variable}')
    
    fig.show()

Variables#

  • ‘IMC’

  • ‘POC_hba1c(%)’

  • ‘perimetro_abdominal’

  • ‘presion_arterial_sistolica’

  • ‘presion_arterial_diastolica’

por :#

  • ‘sexo’

  • ‘edad_grupo’

  • ‘tipo_de_afiliaciion’

  • ‘lugar_de_nacimiento’

  • ‘lugar_de_procedencia’

import pandas as pd
import plotly.graph_objects as go

# Definir intervalos para diferentes variables
hb1a_interv = {
    'POC_hba1c(%)': [0, 5.7, 6.4, 7.5, 10, max(datos.datos['POC_hba1c(%)']) + 4]
}

pres_sist = {
    'masculino': [0, 120, 130, 139, max(datos.datos['presion_arterial_sistolica'])],
    'femenino': [0, 120, 130, 139, max(datos.datos['presion_arterial_sistolica'])]
}

IMC_interv = {
    'IMC': [0, 19.9, 24.9, 29.9, 40, max(datos.datos['IMC']) + 1]
}

per_inter = {
    'masculino': [0, 94, 102, max(datos.datos['perimetro_abdominal'])],
    'femenino': [0, 80, 88, max(datos.datos['perimetro_abdominal'])]
}

pres_diast = {
    'masculino': [0, 80, 90, 120, max(datos.datos['presion_arterial_diastolica'])],
    'femenino': [0, 80, 90, 120, max(datos.datos['presion_arterial_diastolica'])]
}

# Aplicar intervalos personalizados a las variables
datos.datos['POC_hba1c_intervalo'] = pd.cut(datos.datos['POC_hba1c(%)'], bins=hb1a_interv['POC_hba1c(%)'])
datos.datos['IMC_intervalo'] = pd.cut(datos.datos['IMC'], bins=IMC_interv['IMC'])
datos.datos['perimetro_abdominal_intervalo'] = pd.cut(datos.datos['perimetro_abdominal'], bins=per_inter['masculino'])  # Aquí podrías diferenciar entre masculino/femenino si es necesario
datos.datos['presion_arterial_sistolica_intervalo'] = pd.cut(datos.datos['presion_arterial_sistolica'], bins=pres_sist['masculino'])  # Aquí podrías diferenciar entre masculino/femenino si es necesario
datos.datos['presion_arterial_diastolica_intervalo'] = pd.cut(datos.datos['presion_arterial_diastolica'], bins=pres_diast['masculino'])  # Diferenciar según género si lo deseas

# Definir las variables agrupadas
agrupaciones = ['sexo', 'edad_grupo', 'tipo_de_afiliacion', 'lugar_de_nacimiento', 'lugar_de_procedencia']
variables = ['IMC_intervalo', 'POC_hba1c_intervalo', 'perimetro_abdominal_intervalo', 'presion_arterial_sistolica_intervalo', 'presion_arterial_diastolica_intervalo']

# Crear tablas de frecuencias cruzadas y visualizarlas en Plotly
for variable in variables:
    for agrupacion in agrupaciones:
        # Calcular la tabla de frecuencias cruzadas
        tabla_frecuencias = pd.crosstab(datos.datos[agrupacion], datos.datos[variable])

        # Calcular totales por columna y agregar
        totales_columna = tabla_frecuencias.sum(axis=0)  # Sumar por columnas
        totales_columna_df = pd.DataFrame(totales_columna).T  # Convertir a DataFrame y transponer
        totales_columna_df.index = ['Total']  # Renombrar índice

        # Calcular totales por fila y agregar
        totales_fila = tabla_frecuencias.sum(axis=1)  # Sumar por filas
        tabla_frecuencias['Total'] = totales_fila  # Agregar totales por fila a la tabla de frecuencias

        # Concatenar la tabla de frecuencias con los totales por columna
        tabla_con_totales = pd.concat([tabla_frecuencias, totales_columna_df], axis=0)

        # Crear la tabla usando plotly.graph_objects
        fig = go.Figure(data=[go.Table(
            header=dict(values=['Categoría'] + list(tabla_con_totales.columns.astype(str)),
                          fill_color='paleturquoise',
                          align='center'),
            cells=dict(values=[tabla_con_totales.index] + [tabla_con_totales[col] for col in tabla_con_totales.columns],
                       fill_color='lavender',
                       align='center'))
        ])

        # Actualizar el layout y mostrar el gráfico
        fig.update_layout(title=f'Tabla de Frecuencias: {agrupacion} vs {variable}')
        fig.show()

Variables:#

  • ‘POC_hba1c(%)’

  • ‘perimetro_abdominal’

  • ‘presion_arterial_sistolica’

  • ‘presion_arterial_diastolica’

por agrupaciones#

  • ‘hipertension’

  • ‘infarto de miocardio’

  • ‘arritmia’

  • ‘insuficiencia cardiaca congestiva’

  • ‘nefropatia’

agrupaciones = ['hipertension','infarto de miocardio','arritmia','insuficiencia cardiaca congestiva','nefropatia']
variables = ['IMC','POC_hba1c(%)','perimetro_abdominal','presion_arterial_sistolica','presion_arterial_diastolica']
# Definir las agrupaciones y variables
agrupaciones = ['hipertension', 'infarto de miocardio', 'arritmia', 'insuficiencia cardiaca congestiva', 'nefropatia']
variables = ['IMC', 'POC_hba1c(%)', 'perimetro_abdominal', 'presion_arterial_sistolica', 'presion_arterial_diastolica']

# Iterar sobre cada combinación de agrupación y variable
for agrupacion in agrupaciones:
    for variable in variables:
        # Agrupar la variable en función de los intervalos definidos
        if variable == 'IMC':
            datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], IMC_interv['IMC'])
        elif variable == 'POC_hba1c(%)':
            datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], hb1a_interv['POC_hba1c(%)'])
        elif variable == 'presion_arterial_sistolica':
            if agrupacion == 'masculino':
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], pres_sist['masculino'])
            else:
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], pres_sist['femenino'])
        elif variable == 'perimetro_abdominal':
            if agrupacion == 'masculino':
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], per_inter['masculino'])
            else:
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], per_inter['femenino'])
        elif variable == 'presion_arterial_diastolica':
            if agrupacion == 'masculino':
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], pres_diast['masculino'])
            else:
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], pres_diast['femenino'])

        df_grouped = datos.datos.groupby([agrupacion, variable + '_grupo']).size().reset_index(name='counts')
        fig_treemap = px.treemap(df_grouped, path=[agrupacion, variable + '_grupo'], values='counts',
                                 title=f'Treemap de {agrupacion} vs {variable}')
        fig_treemap.show()
        fig_barras_dobles = px.bar(df_grouped, x=agrupacion, y='counts', color=variable + '_grupo',
                                   title=f'Barras Dobles de {agrupacion} vs {variable}', barmode='group')
        fig_barras_dobles.show()
        fig_barras_apiladas = px.bar(df_grouped, x=agrupacion, y='counts', color=variable + '_grupo',
                                     title=f'Barras Apiladas de {agrupacion} vs {variable}', barmode='stack')
        fig_barras_apiladas.show()
agrupaciones = ['hipertension', 'infarto de miocardio', 'arritmia', 'insuficiencia cardiaca congestiva', 'nefropatia']
variables = ['IMC', 'POC_hba1c(%)', 'perimetro_abdominal', 'presion_arterial_sistolica', 'presion_arterial_diastolica']

# Definir las agrupaciones y variables
agrupaciones = ['hipertension', 'infarto de miocardio', 'arritmia', 'insuficiencia cardiaca congestiva', 'nefropatia']
variables = ['IMC', 'POC_hba1c(%)', 'perimetro_abdominal', 'presion_arterial_sistolica', 'presion_arterial_diastolica']

for agrupacion in agrupaciones:
    for variable in variables:
        if variable == 'IMC':
            datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], IMC_interv['IMC'])
        elif variable == 'POC_hba1c(%)':
            datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], hb1a_interv['POC_hba1c(%)'])
        elif variable == 'presion_arterial_sistolica':
            if agrupacion == 'masculino':
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], pres_sist['masculino'])
            else:
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], pres_sist['femenino'])
        elif variable == 'perimetro_abdominal':
            if agrupacion == 'masculino':
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], per_inter['masculino'])
            else:
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], per_inter['femenino'])
        elif variable == 'presion_arterial_diastolica':
            if agrupacion == 'masculino':
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], pres_diast['masculino'])
            else:
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], pres_diast['femenino'])
        df_grouped = datos.datos.groupby([agrupacion, variable + '_grupo']).size().reset_index(name='counts')
        fig_treemap = px.treemap(df_grouped, path=[agrupacion, variable + '_grupo'], values='counts',
                                 title=f'Treemap de {agrupacion} vs {variable}')
        fig_treemap.show()
        fig_barras_dobles = px.bar(df_grouped, x=agrupacion, y='counts', color=variable + '_grupo',
                                   title=f'Barras Dobles de {agrupacion} vs {variable}', barmode='group')
        fig_barras_dobles.show()
        fig_barras_apiladas = px.bar(df_grouped, x=agrupacion, y='counts', color=variable + '_grupo',
                                     title=f'Barras Apiladas de {agrupacion} vs {variable}', barmode='stack')
        fig_barras_apiladas.show()
    

‘IMC’,’POC_hba1c(%)’,’perimetro_abdominal’,’presion_arterial_sistolica’,’presion_arterial_diastolica’#

por ‘fumador’,’bebedor’#

import plotly.io as pio

pio.renderers.default = 'notebook'
hb1a_interv = {'POC_hba1c(%)': [0, 5.7, 6.4, 7.5, 10, max(datos.datos['POC_hba1c(%)']) + 4]}
pres_sist = {'masculino': [0, 120, 130, 139, max(datos.datos['presion_arterial_sistolica'])],
             'femenino': [0, 120, 130, 139, max(datos.datos['presion_arterial_sistolica'])]}
IMC_interv = {'IMC': [0, 19.9, 24.9, 29.9, 40, max(datos.datos['IMC']) + 1]}
per_inter = {'masculino': [0, 94, 102, max(datos.datos['perimetro_abdominal'])],
             'femenino': [0, 80, 88, max(datos.datos['perimetro_abdominal'])]}
pres_diast = {'masculino': [0, 80, 90, 120, max(datos.datos['presion_arterial_diastolica'])],
              'femenino': [0, 80, 90, 120, max(datos.datos['presion_arterial_diastolica'])]}

agrupaciones = ['fumador', 'bebedor']
variables = ['IMC', 'POC_hba1c(%)', 'perimetro_abdominal', 'presion_arterial_sistolica', 'presion_arterial_diastolica']

# Iterar sobre cada combinación de agrupación y variable
for agrupacion in agrupaciones:
    for variable in variables:
        # Agrupar la variable en función de los intervalos definidos
        if variable == 'IMC':
            datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], IMC_interv['IMC'])
        elif variable == 'POC_hba1c(%)':
            datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], hb1a_interv['POC_hba1c(%)'])
        elif variable == 'presion_arterial_sistolica':
            if datos.datos['sexo'].iloc[0] == 'masculino':
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], pres_sist['masculino'])
            else:
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], pres_sist['femenino'])
        elif variable == 'perimetro_abdominal':
            if datos.datos['sexo'].iloc[0] == 'masculino':
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], per_inter['masculino'])
            else:
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], per_inter['femenino'])
        elif variable == 'presion_arterial_diastolica':
            if datos.datos['sexo'].iloc[0] == 'masculino':
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], pres_diast['masculino'])
            else:
                datos.datos[variable + '_grupo'] = pd.cut(datos.datos[variable], pres_diast['femenino'])

        # Crear una tabla agrupada
        df_grouped = datos.datos.groupby([agrupacion, variable + '_grupo']).size().reset_index(name='counts')

        # Treemap
        fig_treemap = px.treemap(df_grouped, path=[agrupacion, variable + '_grupo'], values='counts',
                                 title=f'Treemap de {agrupacion} vs {variable}')
        fig_treemap.show()

        # Barras Dobles (Agrupadas)
        fig_barras_dobles = px.bar(df_grouped, x=agrupacion, y='counts', color=variable + '_grupo',
                                   title=f'Barras Dobles de {agrupacion} vs {variable}', barmode='group')
        fig_barras_dobles.show()

        # Barras Apiladas (Compiladas)
        fig_barras_apiladas = px.bar(df_grouped, x=agrupacion, y='counts', color=variable + '_grupo',
                                     title=f'Barras Apiladas de {agrupacion} vs {variable}', barmode='stack')
        fig_barras_apiladas.show()
import plotly.graph_objects as go
import pandas as pd

import plotly.io as pio

pio.renderers.default = 'notebook'

medicamentos = {
    'Hipolipemiante': [
        'alirocumab', 'Acido fenofibrico', 'Atorvastatina', 'Colestiramina', 'Evolocumab',
        'Ezetimibe', 'Fenofibrato', 'Lovastatina'
    ],
    'Antidiabético': [
        'Dapagliflozina', 'Dulaglutida', 'Empagliflozina', 'Glibenclamida', 'Glimepirida'
    ],
    'Insulina': [
        'Insulina', 'Glargina', 'Glulisina', 'Insulina detemir', 'Insulina Glargina',
        'Insulina lispro', 'Degludec', 'Lantus'
    ]
}


def contar_medicamentos(datos, grupo, medicamentos_lista):
    conteo_medicamentos = []

    medicamentos_filtrados = [med for med in medicamentos_lista if med in datos.columns]

    for med in medicamentos_filtrados:
        conteo = list(datos[med]).count('si')
        conteo_medicamentos.append({'Grupo': grupo, 'Medicamento': med, 'Conteo': conteo})
    return pd.DataFrame(conteo_medicamentos)

def graficar_frecuencias(grupo, df_conteos):
    fig = px.bar(df_conteos, x='Medicamento', y='Conteo', title=f'Frecuencia de Medicamentos - {grupo}')
    fig.show()

# Generar y graficar las frecuencias para cada grupo de medicamentos
for grupo, medicamentos_lista in medicamentos.items():
    conteos_df = contar_medicamentos(datos.datos, grupo, medicamentos_lista)
    graficar_frecuencias(grupo, conteos_df)